//这是Word加件的主要JavaScript脚本，包含了加件的所有交互逻辑。它定义了加件的初始化过程、按钮点击事件处理程序以及与Word文档交互的函数。
// 定义一个变量用于存储消息横幅对象
let messageBanner;

// 在 Home.js 顶部定义变量用于保存原始内容和图片显示状态
let isImagesView = false;
let originalContent = null;
let originalImages = [];
let isTextHidden = false;
let originalTextRanges = [];

// 每次加载新页面时都必须运行初始化函数。
Office.onReady(() => {
    $(() => {
        // 初始化并隐藏 Office Fabric UI 通知机制。
        let element = document.querySelector('.MessageBanner'); // 获取页面中的消息横幅元素
        messageBanner = new components.MessageBanner(element); // 创建消息横幅对象
        messageBanner.hideBanner(); // 隐藏消息横幅
        // 在 Home.js 文件中定义一个变量来存储图片面板的状态


        // 如果未使用 Word 2016，请使用回退逻辑。
        if (!Office.context.requirements.isSetSupported('WordApi', '1.1')) {
           // $("#template-description").text("此示例显示选定的文本。"); // 设置模板描述文本
            $('#button-text').text("显示!"); // 设置按钮文本
            $('#button-desc').text("显示选定的文本"); // 设置按钮描述文本

            $('#highlight-button').on('click', displaySelectedText); // 为按钮添加点击事件处理程序，显示选定的文本
            return; // 退出函数，不执行后续代码
        }

        // 如果使用的是 Word 2016 或更高版本
      //  $("#template-description").text("此示例突出显示文档中选定文本中的最长单词。"); // 设置模板描述文本
        $('#button-text').text("突出显示!"); // 设置按钮文本
        $('#button-desc').text("突出显示最长单词。"); // 设置按钮描述文本

        //设置button2的文本和描述
        $('#button2-text').text("显示图片！");
        $('#button2-desc').text("显示文档中的所有图片。");
        
        //设置隐藏文字按钮的文本
        $('#hide-text-label').text("隐藏文字");

        // 替换 button2 的点击事件处理
        $('#button2').off('click').on('click', toggleImagesPanel);

        // 为隐藏文字按钮添加点击事件处理程序
        $('#hide-text-button').on('click', toggleTextVisibility);

        // 设置随机页脚文字
        setRandomFooterText();

        //loadSampleData(); // 加载示例数据


        // 为突出显示按钮添加单击事件处理程序。
        $('#highlight-button').on('click', hightlightLongestWord); // 为按钮添加点击事件处理程序，突出显示最长单词
        // 添加按钮点击事件处理程序



        // 在 Office.onReady 回调函数中为 button2 添加点击事件处理程序
        /* Office.onReady(() => {
              $(() => {
                  // 其他初始化代码...
  
                  // 为 button2 添加点击事件处理程序
                  $('#button2').on('click', toggleImages);
              });
          });*/



    });
});





// 异步函数，用于加载示例数据到文档中
async function loadSampleData() {
    try {
        // 针对 Word 对象模型运行批处理操作。
        await Word.run(async (context) => {
            // 为文档正文创建代理对象。
            let body = context.document.body;

            // 将清空正文内容的命令插入队列。
            body.clear();
            // 将在 Word 文档正文结束位置插入文本的命令插入队列。
            body.insertText(
                "This is a sample text inserted in the document",
                Word.InsertLocation.end);
            //将在 Word 文档中插一个图片（蓝色方块测试图片）
            body.insertInlinePictureFromBase64(
                "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAdSURBVBiVY2RgYPgPBQxUAKOjCoeBESBHVTAMjAAAGwQBAPU9R/8AAAAASUVORK5CYII=",
                Word.InsertLocation.end);

           


           
            // 通过执行排队的命令来同步文档状态，并返回承诺以表示任务完成。
            await context.sync();
        })
    } catch (error) {
        errorHandler(error); // 处理错误
    }
}

// 异步函数，用于突出显示文档中选定文本中的最长单词
async function hightlightLongestWord() {
    try {
        await Word.run(async (context) => {
            // 将获取当前选定内容的命令插入队列，然后
            // 创建包含结果的代理范围对象。
            let range = context.document.getSelection();

            // 此变量将保存最长单词的搜索结果。
            let searchResults;

            // 将加载范围选择结果的命令插入队列。
            context.load(range, 'text');

            // 通过执行排队的命令来同步文档状态
            // 并返回承诺以表示任务完成。
            await context.sync()
            // 获取选定内容中最长的单词。
            var words = range.text.split(/\s+/).filter(word => word.length > 0); // 将文本按空格分割成单词数组
            if (words.length === 0) {
                showNotification('提示:', '请先选中一些文字，然后再点击高亮按钮。');
                return;
            }
            var longestWord = words.reduce(function (word1, word2) { return word1.length > word2.length ? word1 : word2; }); // 找到最长的单词

            // 将搜索命令排队。
            searchResults = range.search(longestWord, { matchCase: true, matchWholeWord: true }); // 搜索最长的单词

            // 将加载结果的字体属性的命令插入队列。
            context.load(searchResults, 'font');

            await context.sync(); // 同步文档状态
            // 将突出显示搜索结果的命令插入队列。
            searchResults.items[0].font.highlightColor = '#FFFF00'; // 设置字体高亮颜色为黄色
            searchResults.items[0].font.bold = true; // 设置字体为粗体
            
            // 显示提示消息
            showNotification('提示:', '已高亮显示最长单词："' + longestWord + '"。');
        })
    } catch (error) {
        errorHandler(error); // 处理错误
    }
}

// 函数，用于显示选定的文本
function displaySelectedText() {
    Office.context.document.getSelectedDataAsync(Office.CoercionType.Text,
        function (result) {
            if (result.status === Office.AsyncResultStatus.Succeeded) {
                showNotification('选定的文本为:', '"' + result.value + '"'); // 显示选定的文本
            } else {
                showNotification('错误:', result.error.message); // 显示错误信息
            }
        });
}

// 帮助函数，用于处理错误
function errorHandler(error) {
    // 捕获并处理从 Word.run 执行中冒出的任何累积错误
    showNotification("错误:", error); // 显示错误通知
    console.log("Error: " + error); // 在控制台打印错误信息
    if (error instanceof OfficeExtension.Error) {
        console.log("Debug info: " + JSON.stringify(error.debugInfo)); // 打印调试信息
    }
}

// 帮助函数，用于显示通知
function showNotification(header, content) {
    $("#notification-header").text(header); // 设置通知标题
    $("#notification-body").text(content); // 设置通知内容
    messageBanner.showBanner(); // 显示消息横幅
    messageBanner.toggleExpansion(); // 切换消息横幅的展开状态
    
    // 3秒后自动隐藏提示
    setTimeout(() => {
        messageBanner.hideBanner();
    }, 3000);
}



// 获取随机装饰符号的函数
async function getRandomDecoration() {
    try {
        const response = await fetch('decorations.json');
        const data = await response.json();
        const randomIndex = Math.floor(Math.random() * data.decorations.length);
        return data.decorations[randomIndex];
    } catch (error) {
        return '✨'; // 默认装饰
    }
}

// 设置随机页脚文字的函数
async function setRandomFooterText() {
    // 尝试第一个网络源：一言API
    try {
        const hitokotoResponse = await fetch('https://v1.hitokoto.cn/', { 
            method: 'GET',
            timeout: 3000
        });
        
        if (hitokotoResponse.ok) {
            const hitokotoData = await hitokotoResponse.json();
            if (hitokotoData.hitokoto) {
                const decoration = await getRandomDecoration();
                $('.footer .ms-fontColor-white').text(decoration + ' ' + hitokotoData.hitokoto + ' ' + decoration);
                return;
            }
        }
    } catch (error) {
        console.log('一言API失败，尝试备用API');
    }
    
    // 尝试第二个网络源：今日诗词API
    try {
        const shiciResponse = await fetch('https://v2.jinrishici.com/one.svg', {
            method: 'GET',
            timeout: 3000
        });
        
        if (shiciResponse.ok) {
            const shiciText = await shiciResponse.text();
            if (shiciText && shiciText.trim()) {
                const decoration = await getRandomDecoration();
                $('.footer .ms-fontColor-white').text(decoration + ' ' + shiciText.trim() + ' ' + decoration);
                return;
            }
        }
    } catch (error) {
        console.log('今日诗词API失败，使用本地数据');
    }
    
    // 网络失败时使用本地JSON文件
    try {
        const response = await fetch('footerMessages.json');
        const data = await response.json();
        const randomIndex = Math.floor(Math.random() * data.messages.length);
        $('.footer .ms-fontColor-white').text(data.messages[randomIndex]);
    } catch (error) {
        // 如果本地文件也加载失败，使用默认消息
        $('.footer .ms-fontColor-white').text('✨ 前天是小兔，昨天是小鹿，今天是你。 ✨');
    }
}

// 切换图片显示面板的函数
async function toggleImagesPanel() {
    console.log("图片按钮被点击了");

    try {
        await Word.run(async (context) => {
            if (!isImagesView) {
                // 获取所有图片
                let images = context.document.body.inlinePictures;
                context.load(images, 'items');
                await context.sync();
                
                let imageCount = images.items.length;
                if (imageCount === 0) {
                    showNotification("提示:", "当前文档中没有图片。");
                    return;
                }
                
                // 获取图片数据
                let base64Results = [];
                for (let i = 0; i < images.items.length; i++) {
                    base64Results.push(images.items[i].getBase64ImageSrc());
                }
                await context.sync();
                
                // 在任务窗格中显示图片
                let imagesHtml = '<h3>文档中的图片 (' + imageCount + '张)</h3>';
                for (let i = 0; i < base64Results.length; i++) {
                    let base64Data = base64Results[i].value;
                    console.log('Base64 data length:', base64Data ? base64Data.length : 'null');
                    imagesHtml += '<div class="image-container">';
                    if (base64Data) {
                        imagesHtml += '<img src="data:image/png;base64,' + base64Data + '" style="max-width:100%; height:auto; border:1px solid #ccc; margin:5px 0;" />';
                    } else {
                        imagesHtml += '<p>图片数据为空</p>';
                    }
                    imagesHtml += '</div>';
                }
                
                $('#images-panel').html(imagesHtml).show();
                
                isImagesView = true;
                $('#button2-text').text("隐藏图片");
                showNotification("提示:", "已在任务窗格中显示 " + imageCount + " 张图片。");




            } else {
                $('#images-panel').hide();
                isImagesView = false;
                $('#button2-text').text("显示图片！");
                showNotification("提示:", "已隐藏图片面板。");
            }
        });
    } catch (error) {
        errorHandler(error);
    }
}

// 切换文字显示状态的函数
async function toggleTextVisibility() {
    try {
        await Word.run(async (context) => {
           // 先隐藏整个文档
            let range = context.document.body.getRange();
            range.font.hidden = !isTextHidden;
            
            // 然后单独显示图片
            let images = context.document.body.inlinePictures;
            context.load(images, 'items');
            await context.sync();
            
            // 对所有图片取消隐藏
            for (let i = 0; i < images.items.length; i++) {
                images.items[i].getRange().font.hidden = false;
            }
        

           
            
            isTextHidden = !isTextHidden;
            
            if (isTextHidden) {
                $('#hide-text-label').text('显示文字');
                showNotification('提示:', '文字已隐藏，只显示图片。');
            } else {
                $('#hide-text-label').text('隐藏文字');
                showNotification('提示:', '文字已显示。');
            }
            
            await context.sync();
        });
    } catch (error) {
        errorHandler(error);
    }
}


//获取文档中所有的文字
async function getDocumentText() {
    try {
        await Word.run(async (context) => {
            let body = context.document.body;
            context.load(body, 'text');
            await context.sync();

            let text = body.text;
            console.log('Document text:', text);
        });
    } catch (error) {
        errorHandler(error);
    }
}
